package com.linden.std.service.session;

import com.linden.std.domain.vo.UserVO;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * Session管理服务接口
 * 负责用户信息和权限信息的分离存储与同步更新
 */
public interface SessionService {

    /**
     * 刷新用户信息到Session
     * 从Redis获取最新的用户信息并同步到HttpSession
     *
     * @param userId 用户ID
     * @param session HttpSession对象
     */
    void refreshUserInfoToSession(Long userId, HttpSession session);

    /**
     * 刷新权限信息到Session
     * 从Redis获取最新的权限信息并同步到HttpSession
     *
     * @param userId 用户ID
     * @param session HttpSession对象
     */
    void refreshPermissionToSession(Long userId, HttpSession session);

    /**
     * 同时刷新用户信息和权限信息到Session
     * 从Redis获取最新的用户信息和权限信息并同步到HttpSession
     *
     * @param userId 用户ID
     * @param session HttpSession对象
     */
    void refreshUserAndPermissionToSession(Long userId, HttpSession session);

    /**
     * 缓存用户基本信息到Redis
     *
     * @param userId 用户ID
     * @param userVO 用户信息
     */
    void cacheUserInfo(Long userId, UserVO userVO);

    /**
     * 缓存用户权限信息到Redis
     *
     * @param userId 用户ID
     * @param permissions 权限列表
     */
    void cacheUserPermissions(Long userId, List<String> permissions);

    /**
     * 从Redis获取用户基本信息
     *
     * @param userId 用户ID
     * @return 用户信息，如果不存在返回null
     */
    UserVO getUserInfoFromCache(Long userId);

    /**
     * 从Redis获取用户权限信息
     *
     * @param userId 用户ID
     * @return 权限列表，如果不存在返回空列表
     */
    List<String> getUserPermissionsFromCache(Long userId);

    /**
     * 从Session获取用户信息
     *
     * @param session HttpSession对象
     * @return 用户信息，如果不存在返回null
     */
    UserVO getUserInfoFromSession(HttpSession session);

    /**
     * 从Session获取权限信息
     *
     * @param session HttpSession对象
     * @return 权限列表，如果不存在返回空列表
     */
    List<String> getUserPermissionsFromSession(HttpSession session);

    /**
     * 清理用户缓存信息
     *
     * @param userId 用户ID
     */
    void clearUserCache(Long userId);

    /**
     * 清理Session中的用户信息
     *
     * @param session HttpSession对象
     */
    void clearSessionUserInfo(HttpSession session);
}